
### `CPDF_FontGlobals` 类总结

`CPDF_FontGlobals` 是 PDFium 库中用于管理全局字体资源的单例类，主要用于处理嵌入式字符映射表（CMap）和标准字体的加载与查找。以下是该类的主要功能和成员的详细总结：

#### 单例管理

1. **静态方法**:
   - **`static void Create();`**: 创建 `CPDF_FontGlobals` 的单例实例。
   - **`static void Destroy();`**: 销毁 `CPDF_FontGlobals` 的单例实例。
   - **`static CPDF_FontGlobals* GetInstance();`**: 获取 `CPDF_FontGlobals` 的单例实例。

#### 嵌入式字符映射表（CMap）管理

- **`void LoadEmbeddedMaps();`**: 加载所有嵌入式的 CMap。具体加载哪些 CMap 由内部实现决定，通常包括 GB1、CNS1、Japan1 和 Korea1 等常用字符集的 CMap。
  - 内部调用以下私有方法来加载特定字符集的 CMap：
    - **`void LoadEmbeddedGB1CMaps();`**: 加载 GB1 字符集的 CMap。
    - **`void LoadEmbeddedCNS1CMaps();`**: 加载 CNS1 字符集的 CMap。
    - **`void LoadEmbeddedJapan1CMaps();`**: 加载 Japan1 字符集的 CMap。
    - **`void LoadEmbeddedKorea1CMaps();`**: 加载 Korea1 字符集的 CMap。

- **`RetainPtr<const CPDF_CMap> GetPredefinedCMap(const ByteString& name);`**: 根据名称获取预定义的 CMap。返回一个指向 `CPDF_CMap` 对象的智能指针。

- **`CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset);`**: 根据字符集（`CIDSet`）获取 CID 到 Unicode 的映射表。返回一个指向 `CPDF_CID2UnicodeMap` 对象的指针。

#### 嵌入式字符集和 ToUnicode 映射管理

- **`void SetEmbeddedCharset(CIDSet idx, pdfium::span<const fxcmap::CMap> map);`**: 设置指定字符集（`CIDSet`）的嵌入式 CMap。
- **`pdfium::span<const fxcmap::CMap> GetEmbeddedCharset(CIDSet idx) const;`**: 获取指定字符集（`CIDSet`）的嵌入式 CMap。

- **`void SetEmbeddedToUnicode(CIDSet idx, pdfium::span<const uint16_t> map);`**: 设置指定字符集（`CIDSet`）的嵌入式 ToUnicode 映射表。
- **`pdfium::span<const uint16_t> GetEmbeddedToUnicode(CIDSet idx);`**: 获取指定字符集（`CIDSet`）的嵌入式 ToUnicode 映射表。

#### 标准字体管理

- **`void Clear(CPDF_Document* pDoc);`**: 清除与指定文档（`CPDF_Document`）相关的所有标准字体缓存。
- **`RetainPtr<CPDF_Font> Find(CPDF_Document* pDoc, CFX_FontMapper::StandardFont index);`**: 在指定文档（`CPDF_Document`）中查找标准字体。`index` 是 `CFX_FontMapper::StandardFont` 枚举值，表示标准字体的索引。返回一个指向 `CPDF_Font` 对象的智能指针。
- **`void Set(CPDF_Document* pDoc, CFX_FontMapper::StandardFont index, RetainPtr<CPDF_Font> pFont);`**: 在指定文档（`CPDF_Document`）中设置标准字体。`index` 是 `CFX_FontMapper::StandardFont` 枚举值，表示标准字体的索引；`pFont` 是指向 `CPDF_Font` 对象的智能指针。

#### 私有成员变量

- **`std::map<ByteString, RetainPtr<const CPDF_CMap>> m_CMaps;`**: 存储预定义 CMap 的映射表，键为 CMap 名称，值为指向 `CPDF_CMap` 对象的智能指针。
- **`std::array<std::unique_ptr<CPDF_CID2UnicodeMap>, CIDSET_NUM_SETS> m_CID2UnicodeMaps;`**: 存储 CID 到 Unicode 映射表的数组，每个元素是一个 `CPDF_CID2UnicodeMap` 对象的唯一指针。
- **`std::array<pdfium::raw_span<const fxcmap::CMap>, CIDSET_NUM_SETS> m_EmbeddedCharsets;`**: 存储嵌入式 CMap 的数组，每个元素是一个 `fxcmap::CMap` 对象的只读视图。
- **`std::array<pdfium::raw_span<const uint16_t>, CIDSET_NUM_SETS> m_EmbeddedToUnicodes;`**: 存储嵌入式 ToUnicode 映射表的数组，每个元素是一个 `uint16_t` 数组的只读视图。
- **`std::map<UnownedPtr<CPDF_Document>, std::unique_ptr<CFX_StockFontArray>, std::less<>> m_StockMap;`**: 存储每个文档的标准字体缓存，键为 `CPDF_Document` 对象的非拥有指针，值为 `CFX_StockFontArray` 对象的唯一指针。

### 功能概述

`CPDF_FontGlobals` 类是 PDFium 库中管理和共享全局字体资源的核心组件之一，提供了以下主要功能：

1. **单例管理**：通过静态方法创建、销毁和获取单例实例，确保在整个应用程序生命周期内只有一个 `CPDF_FontGlobals` 实例存在。
2. **嵌入式 CMap 加载**：支持加载多种常见字符集的嵌入式 CMap，确保多语言文本的正确显示和渲染。
3. **CMap 和 ToUnicode 映射管理**：提供对预定义 CMap 和嵌入式 CMap 的管理，支持字符码到 Unicode 的双向转换。
4. **标准字体管理**：支持在不同文档中查找和设置标准字体，确保常用字体的高效复用。
5. **字符集映射表管理**：支持设置和获取嵌入式字符集和 ToUnicode 映射表，确保复杂字符集的正确解析和显示。

这些功能共同作用，使得 `CPDF_FontGlobals` 类能够在 PDF 文档处理过程中高效地管理和使用字体资源，确保文本的正确显示和渲染。
// Copyright 2017 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFAPI_FONT_CPDF_FONTGLOBALS_H_
#define CORE_FPDFAPI_FONT_CPDF_FONTGLOBALS_H_

#include <array>
#include <functional>
#include <map>
#include <memory>

#include "core/fpdfapi/cmaps/fpdf_cmaps.h"
#include "core/fpdfapi/font/cpdf_cidfont.h"
#include "core/fxcrt/raw_span.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/span.h"
#include "core/fxge/cfx_fontmapper.h"

class CFX_StockFontArray;
class CPDF_Font;

class CPDF_FontGlobals {
 public:
  // Per-process singleton which must be managed by callers.
  static void Create();
  static void Destroy();
  static CPDF_FontGlobals* GetInstance();

  // Caller must load the maps before using font globals.
  void LoadEmbeddedMaps();

  void Clear(CPDF_Document* pDoc);
  RetainPtr<CPDF_Font> Find(CPDF_Document* pDoc,
                            CFX_FontMapper::StandardFont index);
  void Set(CPDF_Document* pDoc,
           CFX_FontMapper::StandardFont index,
           RetainPtr<CPDF_Font> pFont);

  void SetEmbeddedCharset(CIDSet idx, pdfium::span<const fxcmap::CMap> map) {
    m_EmbeddedCharsets[idx] = map;
  }
  pdfium::span<const fxcmap::CMap> GetEmbeddedCharset(CIDSet idx) const {
    return m_EmbeddedCharsets[idx];
  }
  void SetEmbeddedToUnicode(CIDSet idx, pdfium::span<const uint16_t> map) {
    m_EmbeddedToUnicodes[idx] = map;
  }
  pdfium::span<const uint16_t> GetEmbeddedToUnicode(CIDSet idx) {
    return m_EmbeddedToUnicodes[idx];
  }

  RetainPtr<const CPDF_CMap> GetPredefinedCMap(const ByteString& name);
  CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset);

 private:
  CPDF_FontGlobals();
  ~CPDF_FontGlobals();

  void LoadEmbeddedGB1CMaps();
  void LoadEmbeddedCNS1CMaps();
  void LoadEmbeddedJapan1CMaps();
  void LoadEmbeddedKorea1CMaps();

  std::map<ByteString, RetainPtr<const CPDF_CMap>> m_CMaps;
  std::array<std::unique_ptr<CPDF_CID2UnicodeMap>, CIDSET_NUM_SETS>
      m_CID2UnicodeMaps;
  std::array<pdfium::raw_span<const fxcmap::CMap>, CIDSET_NUM_SETS>
      m_EmbeddedCharsets;
  std::array<pdfium::raw_span<const uint16_t>, CIDSET_NUM_SETS>
      m_EmbeddedToUnicodes;
  std::map<UnownedPtr<CPDF_Document>,
           std::unique_ptr<CFX_StockFontArray>,
           std::less<>>
      m_StockMap;
};

#endif  // CORE_FPDFAPI_FONT_CPDF_FONTGLOBALS_H_
